# 模拟S_100的1000个随机数，画出直方图，计算样本均值和样本方差，写出python代码。

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties

# 设置支持中文的字体，这里以'SimHei'为例。如果你使用其他字体，请替换font_name中的字体名称。
font_name = 'SimHei'  # 或者使用你系统中的其他中文字体名

# 更新matplotlib的字体属性，使得其支持中文显示
plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = [font_name]

# 如果需要支持负号(-)的正常显示，可以添加以下配置
plt.rcParams['axes.unicode_minus'] = False

# 设置随机种子以保证结果可复现（可选）
# np.random.seed(42)

# 参数设置
# n = 100      # 试验次数
# p = 0.5      # 成功概率
# size = 1000  # 生成的随机数个数

# 模拟S_100的随机数1000个
samples=np.zeros(1000)
for k in range(1000):
    samples[k] = np.sum(np.random.choice([-1, 1], size=100, p=[0.5, 0.5]))

# 计算样本均值和样本方差
sample_mean = np.mean(samples)
sample_var = np.var(samples, ddof=1)  # 使用ddof=1计算样本方差（无偏估计）

print(f"样本均值: {sample_mean:.4f}")
print(f"样本方差: {sample_var:.4f}")

# 理论均值和方差（用于对比）
theoretical_mean = 0
theoretical_var = 100
print(f"理论均值: {theoretical_mean:.4f}")
print(f"理论方差: {theoretical_var:.4f}")

# 绘制直方图
plt.figure(figsize=(10, 6))
plt.hist(samples, 
         bins = 10, 
        # bins=range(-101, 102), 
        # bins=201, range=(-100.5, 100.5), 
         density=True, 
        #  alpha=0.7, 
         color='skyblue', 
         edgecolor='black', 
         label='模拟数据'
         )

# 添加理论均值和方差的正态分布曲线（中心极限定理近似）
from scipy import stats
x = np.linspace(-30, 30, 100)
y = stats.norm.pdf(x, loc=theoretical_mean, scale=np.sqrt(theoretical_var))
plt.plot(x, y, 'r-', linewidth=2, label='N(0, 100) 近似')

plt.title('随机变量 $S_{100}$ 的1000个随机数的直方图')
plt.xlabel('$S_{100}$')
plt.ylabel('频率')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
